﻿#pragma once


#include <QStack>
#include <QMap>
#include <functional>

//该类用于解析并计算数学表达式,属于model层

class Calculator {
public:
    //注册支持的操作符
    Calculator();

    ~Calculator() {};

    // 主计算函数：传入表达式字符串，返回计算结果
    long double calculate(QString& expression);

private:
    using UnaryOp = std::function<void(QStack<long double>&)>;
    using BinaryOp = std::function<void(QStack<long double>&)>;

    // 注册一元和二元运算符
    void registerOperators();

    // 将表达式字符串转为 token 序列（中缀表达式）
    void strToVector(const QString& s, QVector<QString>& infix);

    // 将中缀表达式转为后缀表达式（逆波兰式）
    void vectorToStack(const QVector<QString>& infix, QQueue<QString>& postfix);

    // 获取操作符的优先级
    int getOperatorPrecedence(const QString& op);

    // 判断当前位置是否为负号前缀
    bool isNegativePrefix(const QString& s, int i);

    //一元操作函数
    void applySqrt(QStack<long double>& stack);
    void applySquare(QStack<long double>& stack);
    void applyPercent(QStack<long double>& stack);

    //二元操作函数
    void applyAdd(QStack<long double>& stack);
    void applySub(QStack<long double>& stack);
    void applyMul(QStack<long double>& stack);
    void applyDiv(QStack<long double>& stack);

    QMap<QString, UnaryOp> m_unaryOps;   // 一元操作符映射
    QMap<QString, BinaryOp> m_binaryOps; // 二元操作符映射
};

